CNC の例 10: 動的 CNC パスのプログラミング
を参照してください CNC10_DynamicPath.project
のインストールディレクトリにあるサンプルプロジェクト CODESYS 下 ..\CODESYS SoftMotion\Examples
.
この例では、CNC プログラム オブジェクトまたはファイルから G コードを入力せずに、実行時にアプリケーションで CNC パスを直接作成する方法を示します。この種の従来の CNC プログラムをコンパイルすると、パス データは SMC_CNC_Data
データ構造タイプ。この内部データは、コンパイル モードに応じて特定のグローバル データ構造にコンパイルされます (SMC_CNC_REF また SMC_OutQueue)。
コンパイルモードの場合 SMC_CNC_REF、データはの配列に格納されます SMC_GEOINFO
要素。アプリケーションコードの配列は通常、関数ブロックインスタンスに渡されます SMC_NCDecoder
。実行時に、データはそこでデコードされ、タイプのグローバルデータ構造に格納されます SMC_OUTQUEUE
。次に、パス前処理機能ブロックを呼び出すことができます。
コンパイルモードの場合 SMC_OutQueue、グローバルデータ構造(SMC_OUTQUEUE
)が生成されます 直接。アプリケーションコード内のこのデータ構造は、補間器に渡されます(SMC_Interpolator
FBインスタンス)。機能ブロック SMC_NCDecoder
は呼び出されません。
コンパイルモードの場合 ファイル、データはファイルに保存されます。データは、タイプの要素の配列として格納されます SMC_GEOINFO
コンパイルモードで生成されたデータに対応します SMC_CNC_REF。
CNCパスをプログラミングする代わりに、タイプのデータ構造をインスタンス化するアプリケーションコードをプログラミングできます。 SMC_OUTQUEUE
実行時に、その値を割り当てます。実行時に動的に生成されるCNCパスをプログラムします。データ構造を他の汎用ブロックインスタンス(たとえば、パス前処理汎用ブロックまたは汎用ブロック)に渡すことができます。 SMC_Interpolator
)。
プログラミング
ヒント
The CNCDynamicPath
サンプルプロジェクトは、のインストールディレクトリにあります。 CODESYS。サンプルプロジェクトは、 CNConline
事業。それは含まれています Path
グラフィカルにプログラムされた代わりにプログラム Example
道。タイプのデータ構造 SMC_OUTQUEUE
動的に生成されます。
タイプのデータ構造を宣言します
SMC_OUTQUEUE
。データ構造にはCNCパスデータが含まれており、動的に入力されます。例:
QUEUE
必要な量のパスにメモリを割り当てます。
SMC_GEOINFO
要素。例:
BUF
タイプの変数を宣言します
SMC_GEOINFO
最初のステップで。例:
GEO
データ型の配列要素
SMC_GEOINFO
CNCコードのパス要素に対応します。要素をに追加するには、要素ごとに次の手順を実行する必要があります。SMC_OUTQUEUE
:すべての配列要素には、前の配列要素の終了位置に対応する開始位置があります。
例:
GEO.piStartPos.dX := 0;
またGEO.piStartPos := GEO.piDestPos;
各配列要素の移動タイプを決定します。
例:
GEO.iMoveType := CCLW;
またGEO.iMoveType := LIN;
移動タイプのパラメータを設定します。これは、すべての移動タイプに必要なわけではありません。
例:円弧(移動タイプ:CCLW)の場合、次の位置を設定する必要があります。
geoinfo_A[i].dP1 := 200; geoinfo_A[i].dP2 := 100; geoinfo_A[i].dP3 := 50; geoinfo_A[i].dT1 := 0; geoinfo_A[i].dT2 := 90;
終了位置の計算を挿入します。
SMC_CalcEndPnt(ADR(GEO));
オブジェクトの長さの計算を挿入します。
SMC_CalcLengthGeo(ADR(GEO));
オブジェクトをに保存します
QUEUE
:SMC_AppendObj(POQ:=ADR(QUEUE), PGI:=ADR(GEO));
パスが完全に作成されたら、終了マーカーを設定する必要があります。 QUEUE-bEndOfList = TRUE;
ヒント
次に、パス前処理機能ブロックが呼び出されると、の開始ビットまたは終了ビットを設定する必要があります。 InternMark
。
2つのパス要素を持つCNCパス
この例では、配列はX / Y位置で定義されていません。説明したようにこれが2つのパス要素を持つ例である場合、これらの配列にはそれぞれ2つの要素が必要です。
たとえば、サンプルプロジェクトから派生したもの:
xp:ARRAY[1..2] OF REAL:= [100,50]; yp:ARRAY[1..2] OF REAL:= [0,100];
PROGRAM Path VAR iState : INT; QUEUE : SMC_OUTQUEUE; BUF : ARRAY[0..49] OF SMC_GEOINFO; // Memory allocation GEO : SMC_GEOINFO:=(dT1:=0, dT2:=1, dToolRadius:=0, dVel:=100, dVel_End:=100, dAccel:=200, dDecel:=500, iObj_Nr:=0); // Initial path element n : INT := 0; QUEUE.nSize := SIZEOF(BUF); END_VAR CASE iState OF 0: QUEUE.pbyBuffer := ADR(BUF[0]); // Initialize QUEUE SMC_SetQueueCapacity(ADR(QUEUE), SIZEOF(BUF)); iState := iState + 1; 1: // Fill QUEUE WHILE NOT QUEUE.bFull DO // When QUEUE is full, wait until it has been processed by the following FBs n := n + 1; GEO.iSourceLine_No := n; GEO.piStartPos := GEO.piDestPos; // Copying last destination GEO.iMoveType := LIN; // Generating linear movement GEO.iObjNo := GEO.iObjNo + 1; // Calculating number GEO.piDestPos.dX := xp[n]; // Generatint position GEO.piDestPos.dY := yp[n]; SMC_CalcLengthGeo(pg := ADR(GEO)); // Calculating length of object with the help of the standard function SMC_AppendObj(poq:=ADR(QUEUE), pgi:=ADR(GEO)); // Appending object to QUEUE IF n = SIZEOF(xp)/SIZEOF(xp[1]) THEN // All target positions processed QUEUE.bEndOfList := TRUE; n := 0; iState := 2; EXIT; END_IF END_WHILE 2: //Done ; END_CASE CheckVel(bExecute:=TRUE , poqDataIn:=ADR(queue)); // Preprocessing
重要
の場合 SMC_OUTQUEUE
データ構造には次のデータが入力されます SMC_GEOINFO
データとデータ構造要素がに設定されました bFULL = TRUE
、その後の割り当てはお勧めしません SMC_GEOINFO
データ。この場合、パスの作成は、実行時に、の最初の要素まで中断されます。 SMC_OUTQUEUE
データ構造は補間器で処理されます。その場合にのみ、別の要素が挿入されます。
十分なメモリを割り当てることにより、この中断を回避してください。変数を参照してください BUF
。
重要
データ構造の場合 SMC_OUTQUEUE
最初の実行後に補充され、次に補間器とすべての前処理機能ブロックが補充されます(例: SMC_CheckVelocities
)で立ち上がりエッジで再起動する必要があります Execute
。